#ifndef INPUTCONTEXT_H
#define INPUTCONTEXT_H

#include "pinyinhandler.h"
#include "dicthandler.h"
#include "OpenCCUtil.h"
#include "BaiduPinyinApi.h"
#include "configmanager.h"
#include <QObject>
#include <QString>
#include <QVector>
#include <QMutex>
#include <QRegularExpression>

// 前置声明
struct PinyinCandidate;

// 拼音输入类型枚举
enum class PinyinType {
    FullPinyin,    // 全拼
    DoublePinyin, // 双拼
    SimplePinyin  // 简拼
};

class InputContext : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY_MOVE(InputContext)
	friend class InputTextEdit;

public:
    // 单例接口（线程安全）
    static InputContext* getInstance(QObject *parent = nullptr);
    ~InputContext() override;

    // 输入处理接口
    void processKeyPress(const QString& key);  // 处理按键输入
    void selectCandidate(int index);           // 选择候选词（按索引）
    void cancelInput();                        // 取消当前输入
    void commitText(const QString& text);      // 手动提交文本
    void setInputMode(PinyinType type);       // 设置拼音输入类型

    // 状态查询接口
    bool isInComposition() const { return !m_composingText.isEmpty(); }
    QString composingText() const { return m_composingText; }
    QVector<PinyinCandidate> currentCandidates() const { return m_currentCandidates; }

    // 配置同步接口（与UI层联动）
    void syncConvertDirection(OpenCCUtil::ConvertDirection dir);
    void syncUseBaiduApi(bool use);

signals:
    void compositionUpdated(const QString& composingText);  // 拼音输入更新
    void candidatesUpdated(const QVector<PinyinCandidate>& candidates);  // 候选词更新
    void textCommitted(const QString& text);  // 文本提交通知
    void inputCanceled();                    // 输入取消通知
    void errorOccurred(const QString& errorMsg);  // 错误通知

private slots:
    // 拼音解析完成回调
    void onPinyinProcessed(const QVector<PinyinCandidate>& candidates);
    // 词典更新回调（刷新候选词）
    void onDictUpdated();

private:
    // 私有构造：确保单例
    explicit InputContext(QObject *parent = nullptr);
    // 重置输入状态（清空拼音/候选词）
    void resetState();
    // 过滤无效按键（仅保留合法输入键）
    bool isValidKey(const QString& key);
    // 拼接当前输入拼音（统一转为小写）
    void appendComposingText(const QString& key);

private:
    static InputContext* m_instance;
    static QMutex m_instanceMutex;  // 单例线程安全锁

    // 输入状态变量
    QString m_composingText;                // 当前输入的拼音（如"zhongg"）
    QVector<PinyinCandidate> m_currentCandidates;  // 当前候选词列表
    bool m_isComposing = false;            // 是否处于输入中

    // 配置缓存
    PinyinType m_currentPinyinType = PinyinType::FullPinyin;  // 当前拼音类型
    OpenCCUtil::ConvertDirection m_currentConvertDir = OpenCCUtil::ConvertDirection::T2S;  // 简繁方向
    bool m_currentUseBaiduApi = true;  // 是否启用百度API（多音字解析）

    // 依赖组件
    PinyinHandler* m_pinyinHandler = nullptr;
    DictHandler* m_dictHandler = nullptr;
    OpenCCUtil* m_openccUtil = nullptr;
    BaiduPinyinApi* m_baiduApi = nullptr;
};

#endif  // INPUTCONTEXT_H